package other;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

/**
 * 法定节假日查询工具类
 *
 * @author superC
 * @version 1.0.0
 * @date 2024/4/7
 */

public class HolidayUtil {

    private static final String WORK = "工作";

    private static final String REST = "休息";

    private static final String URL_TODAY_RESULT = "http://api.haoshenqi.top/holiday/today";

    private static final String URL_DAY_RESULT = "http://api.haoshenqi.top/holiday?date=";

    /**
     * 今天是否要上班
     *
     * @return null表示调用接口失败；
     */
    public static Boolean todayHasWork() {
        String result = HttpUtil.get(URL_TODAY_RESULT, 2000);
        if (result == null) {
            return null;
        }
        return result.equals(WORK);
    }

    /**
     * 今天是否为法定节假日
     *
     * @return null表示调用接口失败；
     */
    public static Boolean todayHasHoliday() {
        return dayHasHoliday(DateUtil.today());
    }

    /**
     * 判断指定日期，是否为法定节假日
     *
     * @param day 日期字符串，格式为yyyy-MM-dd
     * @return null表示调用接口失败；
     */
    public static Boolean dayHasHoliday(String day) {
        String dayStatus = getDayStatus(day);
        if (StrUtil.isBlank(dayStatus)) {
            return null;
        }
        return dayStatus.equals(REST);
    }

    /**
     * 判断指定日期，是否为工作日
     *
     * @param day 日期字符串，格式为yyyy-MM-dd
     * @return null表示调用接口失败；
     */
    public static Boolean dayHasWork(String day) {
        String dayStatus = getDayStatus(day);
        if (StrUtil.isBlank(dayStatus)) {
            return null;
        }
        return dayStatus.equals(WORK);
    }

    private static String getDayStatus(String day) {
        String result = HttpUtil.get(URL_DAY_RESULT + day, 2000);
        System.out.println(result);
        if (result == null) {
            return null;
        }
        JSONArray resultArr = JSONUtil.parseArray(result);
        JSONObject resultObj = (JSONObject) resultArr.get(0);
        int status = Integer.parseInt(resultObj.get("status").toString());
        return DayStatusEnum.getByCode(status);
    }

    enum DayStatusEnum {
        /**
         * 普通工作日
         */
        WORKING_DAY(0, WORK),
        /**
         * 周末双休日
         */
        WEEKEND(1, WORK),
        /**
         * 需要补班的工作日
         */
        WORKING_ADJUST(2, WORK),
        /**
         * 法定节假日
         */
        LEGAL_HOLIDAYS(3, REST);


        private final int code;
        private final String name;

        DayStatusEnum(int code, String name) {
            this.code = code;
            this.name = name;
        }

        public int getCode() {
            return code;
        }

        public String getName() {
            return name;
        }

        public static String getByCode(int code) {
            for (DayStatusEnum statusEnum : DayStatusEnum.values()) {
                if (statusEnum.getCode() == code) {
                    return statusEnum.name;
                }
            }
            return null;
        }
    }

}
